﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Xml.Linq;
using System.Windows.Threading;
using System.Collections;
using System.Threading;
using System.Speech.Synthesis;
using System.Speech.Recognition;

namespace MBO_PIM
{
    /// <summary>
    /// Interaktionslogik für TermineAnzeigen.xaml
    /// </summary>
    public partial class TermineAnzeigen : Window
    {
        private MainWindow mainWindow;
        private Sprachausgabe voiceOutput;

        public TermineAnzeigen(MainWindow window)
        {
            InitializeComponent();

            mainWindow = window;
            voiceOutput = window.getSprachausgabe();

            //tabelleAktualisieren();

            // weißt dem DataGrid das XML-Dokument zu
            XElement xml = XDocument.Load("..\\..\\datenbank.xml").Root;
            dataGrid1.DataContext = xml;

            // Laden der XML-Datei
            XElement termine = XDocument.Load("..\\..\\datenbank.xml").Root;

            // durchlaufen der XML-Datei und speichern des Ausgabebuilders
            PromptBuilder builder = new PromptBuilder(new System.Globalization.CultureInfo("de-DE"));

            builder.AppendText("Your Schedule");
            builder.AppendBreak(PromptBreak.Medium);
            foreach (var a in termine.Elements())
            {
                builder.AppendText((String)a.Element("Titel").Value + " on " + (String)a.Element("Datum").Value);
                builder.AppendBreak(PromptBreak.Small);
            }

            // Sprachausgabe
            Thread thread = new Thread(new ParameterizedThreadStart(voiceOutput.SayBuilder));
            thread.Start(builder);

            // Spracheingabe
            SpeechRecognitionEngine recognizer = mainWindow.recognizer;

            recognizer.SpeechRecognized += (s, e1) =>
            {

                string text = e1.Result.Text;
                Console.WriteLine("Spracheingabe: " + text);

                if (text.Equals("Termin löschen"))
                {
                    if (this.IsActive) loeschen1();
                }
                if (text.Equals("Termin bearbeiten"))
                {
                    if (this.IsActive) bearbeiten1();
                }
            };
        }

        public void bearbeiten1()
        {
            if (dataGrid1.SelectedItem != null)
            {
                // selektiertes Element aus Datagrid
                XElement elem = (XElement)dataGrid1.SelectedItem;

                this.Close();

                Window window = new TerminBearbeiten(elem, mainWindow);
                window.Show();
            }

        }

        public void loeschen1()
        {
            // MessageBox für die Abfrage, ob der Termin wirklich gelöscht werden soll
            string messageBoxText = "Wollen Sie den ausgewählten Termin wirklich löschen?";
            string caption = "Benachrichtigung";
            MessageBoxButton button = MessageBoxButton.YesNo;
            MessageBoxImage icon = MessageBoxImage.Warning;
            MessageBoxResult result = MessageBox.Show(messageBoxText, caption, button, icon);
            // ja, nein, abbrechen Befehlszuweisung
            switch (result)
            {
                case MessageBoxResult.Yes:

                    // selektiertes Element aus Datagrid
                    XElement elem = (XElement)dataGrid1.SelectedItem;
                    // Laden der XML-Datei
                    XElement termine = XDocument.Load("..\\..\\datenbank.xml").Root;
                    // zwischenspeicher für Datumstitel
                    String oldDateString = "";
                    // durchlaufen der XML-Datei und finden und löschen des passenden Termins
                    foreach (var a in termine.Elements())
                    {
                        String zwei = (String)elem.Element("Datum").Value;
                        String eins = (String)a.Element("Datum").Value;
                        String drei = (String)elem.Element("Uhrzeit").Value;
                        String vier = (String)a.Element("Uhrzeit").Value;

                        oldDateString = (String)elem.Element("Titel").Value;

                        if (eins.CompareTo(zwei) == 0 && drei.CompareTo(vier) == 0)
                        {
                            a.Remove();
                        }
                    }
                    // XML-Datei abspeichern
                    termine.Save("..\\..\\datenbank.xml");

                    // Fenster schließen und wieder öffnen um die Tabelle zu aktualisieren
                    this.Close();
                    mainWindow.TermineAnzeigen();

                    // Sprachausgabe
                    Thread thread = new Thread(new ParameterizedThreadStart(voiceOutput.SayString));
                    thread.Start("Date " + oldDateString + "has been removed.");

                    break;
                case MessageBoxResult.No:
                    break;
            }
        }

        // Methode zum Löschen-Button
        private void loeschen_Click(object sender, RoutedEventArgs e)
        {
            loeschen1();
        }

        // Methode für den Bearbeiten-Button
        private void bearbeiten_Click(object sender, RoutedEventArgs e)
        {
            bearbeiten1();
        }

    }
}